parser grammar AnalexXMLParser;

options {
  language = Java;
  tokenVocab = AnalexXMLLexer;
}

@header {
  package Practica8.Sintactico;
}

@members {
  private ArrayList<String> errors = new ArrayList<String>();
  public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
    String hdr = getErrorHeader(e);
    String msg = getErrorMessage(e, tokenNames);
    errors.add(hdr + " " + msg);
  }
   
  public ArrayList<String> getErrors() {
    return errors;
  }
}

entrada: sentencia;

sentencia: (etiqueta)+;

etiqueta
  : INIT_TAG 
  (in = ID) 
   (atributos)* 
   FIN_TAG 
  (cuerpo)* 
   endtag [in.getText()]
  ;
  
cuerpo: (etiqueta | PCDATA);
atributos  : ID ATTR_EQ ATTR_VALUE ;

endtag [String in] 
  : OUT_TAG 
  (out = ID) 
  FIN_TAG 
  { if (!in.equals(out.getText()))
       System.out.println("El cierre de la etiqueta " + out + " no coincide con la apertura " + in );
  }
  ;